<template>

	<div class="in-coder-panel">
		<textarea ref="textarea"></textarea>
		<el-select class="code-mode-select" v-model="selectedMode" @change="changeMode">
			<el-option v-for="mode in modes"
		        :key="mode.value" :label="mode.label" :value="mode.value">
			</el-option>
		</el-select>
	</div>
  
</template>

<script type="text/ecmascript-6">
  // 引入全局实例
  import _CodeMirror from 'codemirror'


  import 'codemirror/lib/codemirror.css'
  import 'codemirror/theme/duotone-light.css'
  import 'codemirror/mode/clike/clike.js'
  import 'codemirror/mode/javascript/javascript.js'
  import 'codemirror/mode/css/css.js'
  import 'codemirror/mode/xml/xml.js'
  import 'codemirror/mode/python/python.js'



  // 尝试获取全局实例
  const CodeMirror = window.CodeMirror || _CodeMirror

  export default {
    name: 'coder',
    props: {
      value: String,
      // 外部传入的语法类型
      language: {
        type: String,
        default: null
      }
    },
    data () {
      return {
		probId:0,
        // 内部真实的内容
        code: '',
        // 默认的语法类型
        selectedMode: 'javascript',
        // 编辑器实例
        coder: null,
        // 默认配置
        options: {
          // 缩进格式
          tabSize: 2,
          // 主题
          theme: 'duotone-light',
          // 显示行号
          lineNumbers: true,
          line: true
        },

        modes: [{
          value: 'x-csrc',
          label: 'C'
        }, {
		  value: 'x-c++src',
		  label: 'C++'
		}, {
          value: 'x-java',
          label: 'Java'
        }, {
          value: 'css',
          label: 'CSS'
        }, {
          value: 'javascript',
          label: 'Javascript'
        }, {
          value: 'html',
          label: 'XML/HTML'
        },  {
          value: 'x-python',
          label: 'Python'
        }, ]
      }
    },
	watch: {
	    "$route": "updateProbId"
	},
    mounted () {
      // 初始化
      this._initialize()
    },
    methods: {

      // 初始化
      _initialize () {
        // 初始化编辑器实例，传入需要被实例化的文本域对象和默认配置
        this.coder = CodeMirror.fromTextArea(this.$refs.textarea, this.options)
        // 编辑器赋值
        this.coder.setValue(this.value || this.code)

        // 支持双向绑定
        this.coder.on('change', (coder) => {
          this.code = coder.getValue()

          if (this.$emit) {
            this.$emit('input', this.code)
          }
        })

        // 尝试从父容器获取语法类型
        if (this.language) {
          // 获取具体的语法类型对象
          let modeObj = this._getLanguage(this.language)

          // 判断父容器传入的语法是否被支持
          if (modeObj) {
            this.mode = modeObj.label
          }
        }
		
		
      },
      // 获取当前语法类型
      _getLanguage (language) {
        // 在支持的语法类型列表中寻找传入的语法类型
        return this.modes.find((mode) => {
          // 所有的值都忽略大小写，方便比较
          let currentLanguage = language.toLowerCase()
          let currentLabel = mode.label.toLowerCase()
          let currentValue = mode.value.toLowerCase()

          // 由于真实值可能不规范，例如 java 的真实值是 x-java ，所以讲 value 和 label 同时和传入语法进行比较
          return currentLabel === currentLanguage || currentValue === currentLanguage
        })
      },
      // 更改模式
      changeMode (val) {
        // 修改编辑器的语法配置
        this.coder.setOption('mode', `text/${val}`)
		this.coder.setValue("")
        // 获取修改后的语法
        let label = this._getLanguage(val).label.toLowerCase()
		this.selectedMode=this._getLanguage(val).value
        // 允许父容器通过以下函数监听当前的语法值
        this.$emit('language-change')
      },
	 
	  
    }
  }
</script>

<style lang="stylus" rel="stylesheet/stylus">

  .in-coder-panel
    flex-grow 1
    display flex
    position relative
	
    .CodeMirror
      height: 420px;
      flex-grow 1
      z-index 1
      .CodeMirror-code
        line-height 19px

    .code-mode-select
      position absolute
      z-index 2
      right 10px
      top 10px
      max-width 130px
</style>
